#include "sum.h"


//打印枚举
void printCMDType(CMD cmd) {
    switch(cmd) {
        case CMD_TYPE_REGIT1_OK:
            printf("Command Type: CMD_TYPE_REGIT1_OK\n");
            break;
        case CMD_TYPE_REGIT1_ERROR:
            printf("Command Type: CMD_TYPE_REGIT1_ERROR\n");
        default:
            printf("Command Type: UNKNOWN\n");
            break;
    }
}

int disable_echo() {
    struct termios tty;
    if (tcgetattr(STDIN_FILENO, &tty) != 0) {
        return -1;
    }
    tty.c_lflag &= ~ECHO;
    if (tcsetattr(STDIN_FILENO, TCSANOW, &tty) != 0) {
        return -1;
    }
    return 0;
}

int enable_echo() {
    struct termios tty;
    if (tcgetattr(STDIN_FILENO, &tty) != 0) {
        return -1;
    }
    tty.c_lflag |= ECHO;
    if (tcsetattr(STDIN_FILENO, TCSANOW, &tty) != 0) {
        return -1;
    }
    return 0;
}

/*         启用终端回显，返回0表示成功，-1表示失败         */


/* 读取用户输入的密码和用户名 第四个参数设置为1就算隐式输入，设置为零就算显示输入*/
int input_msg(const char* tips, char* buff, int len, int input_style) {
    printf("%s", tips);
    fflush(stdout); // 刷新输出缓冲区，确保提示信息显示出来

    if (input_style) {
        disable_echo(); // 禁用终端回显
    }

    // 读取用户输入
    if (fgets(buff, len, stdin) == NULL) {
        error(0, errno, "failed to read user input");
        if (input_style) {
            enable_echo(); // 确保即使发生错误也恢复终端回显
        }
        return -1;
    }

    if (input_style) {
        enable_echo(); // 启用终端回显
    }

    // 移除换行符
    size_t length = strlen(buff); // 获取实际输入的字符串长度
    if (length > 0 && buff[length - 1] == '\n') {
        buff[length - 1] = '\0'; // 替换换行符为字符串终止符
    }

    return 0;
}

int client_regite1(int connect_fd,cmd_tast *t) {
    while(1){
        memset(t->content,0,MAXCMDSIZE);   
        char username[MAXCMDSIZE]={0};

remake:
        // 输入用户名
        
        t->cmdType = CMD_TYPE_REGIT1;
        input_msg("请输入用户名: ", username, sizeof(username), 0);
        // 复制用户名到结构体字段
        strcpy(t->content, username);
        strcpy(t->path, username);

        //发送用户名
        int err=send(connect_fd, (char*)t, sizeof(*t),0);
        if(err==-1){
            error(0,errno,"send name error");
        }

        //接收服务器读取状态
        err = recv(connect_fd,(char*)t,sizeof(*t),0);
        if(err==-1){
            error(0,errno,"login_regite1 recv");
            continue;
        }   
        if(t->cmdType==CMD_TYPE_REGIT1_OK){
            printf("您输入的用户名没用被注册过\n");
            break;
        }
        if(t->cmdType==CMD_TYPE_REGIT1_ERROR){
            printf("用户名存在，请重新输入\n");
            goto remake;
        }
    }
    return 0;
}
int client_regite2(int connect_fd, cmd_tast *t) {
    
        // 用户输入密码
        char password[MAX_PASSWORD_LEN];
        input_msg("请输入密码:", password, sizeof(password),1);
        // 接收服务器发过来的盐值
        int err = recv(connect_fd,(char*)t, sizeof(*t), 0);
        if(err==-1){
            error(0,errno,"recv the salt error");
        }
        // 将密码和盐值生成密文
        char *encrypted_password = crypt(password, t->path);
        printf("encrypted_password:%s\n",encrypted_password);
        if (encrypted_password == NULL) {
            perror("crypt failed");
            return -1;
        }

        t->cmdType = CMD_TYPE_REGIT2; 
        //把盐值换成密文
        memset(&t->path,0,sizeof(t->path));
        strncpy(t->path, encrypted_password, sizeof(t->path));

        
        // 发送密文到服务器
        err = send(connect_fd, (char *)t, sizeof(cmd_tast), 0);
        if (err == -1) {
            error(0,errno,"send cryptpassword error"); 
         }
     
       

    //注册成功
      err = recv(connect_fd,(char*)t,sizeof(*t),0);
    if(err==-1){
        error(0,errno,"login_regite2 recv error");
    }   
    if(t->cmdType==CMD_TYPE_REGIT_OKK){
        printf("\n注册成功\n");
        strcpy(t->path,t->content);
        printf("t.content");
    }

    return 0;
}
